#include "Placa.h"


Placa::Placa(float ancho, float alto){
	// Cuadrado de 1 de lado con su costado izquierdo tocando el eje z,
	// su base apoyada en el eje y, y la normal sobre el eje x
	this->m_vertices[0] = glm::vec3(0.0f, 0.0f, 0.0f);
	this->m_coords[0] = glm::vec2(0.0f, 0.0f);
	this->m_normales[0] = glm::vec3(1.0f, 0.0f, 0.0f);
	this->m_tangentes[0] = glm::vec3(0.0f, 0.0f, 1.0f);

	this->m_vertices[1] = glm::vec3(0.0f, ancho, 0.0f);
	this->m_coords[1] = glm::vec2(ancho, 0.0f);
	this->m_normales[1] = glm::vec3(1.0f, 0.0f, 0.0f);
	this->m_tangentes[1] = glm::vec3(0.0f, 0.0f, 1.0f);

	this->m_vertices[2] = glm::vec3(0.0f, ancho, alto);
	this->m_coords[2] = glm::vec2(ancho, alto);
	this->m_normales[2] = glm::vec3(1.0f, 0.0f, 0.0f);
	this->m_tangentes[2] = glm::vec3(0.0f, 0.0f, 1.0f);

	this->m_vertices[3] = glm::vec3(0.0f, 0.0f, alto);
	this->m_coords[3] = glm::vec2(0.0f, alto);
	this->m_normales[3] = glm::vec3(1.0f, 0.0f, 0.0f);
	this->m_tangentes[3] = glm::vec3(0.0f, 0.0f, 1.0f);

	// El indexbuffer de la placa
	this->m_indexBuffer[0] = 0;
	this->m_indexBuffer[1] = 1;
	this->m_indexBuffer[2] = 2;
	this->m_indexBuffer[3] = 3;
}


void Placa::renderizar(const glm::mat4 &matVista, const glm::mat4 &matProyeccion, const glm::mat4 &matModelo) const {
	// Carga el shader
	Renderizable::cargarShaderProgram();

	// Empieza a dibujar todo
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);

	// Las matrices de transformacion, iluminacion y textura
	Renderizable::cargarMatricesTransformacion(matVista, matProyeccion, matModelo);
	Renderizable::cargarDatosIluminacion(matModelo, matVista);
	Renderizable::cargarTextura();

	Renderizable::cargarNormalMap();

	// Suponemos que se seteo el archivo de normales para el bump mapping
	glTexCoordPointer(2, GL_FLOAT, 0, this->m_coords);

	// El cubo
	glVertexPointer(3, GL_FLOAT, 0, this->m_vertices);
	glNormalPointer(GL_FLOAT, 0, this->m_normales);

	// Se pasan las normales por la variable gl_Color
	glColorPointer(3, GL_FLOAT, 0, this->m_tangentes);
	glTexCoordPointer(2, GL_FLOAT, 0, this->m_coords);

	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, this->m_indexBuffer);

	// Listo
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
}

